#include "keyboard.h"

/** 
 * @brief 键值
 * 
 */ 
static uint16_t keyval = 0;

/** 
 * @brief 记录几个按键引脚的编号
 * 
 */ 
static KEY_PIN_t __PinInput[4] =
    {{KEY_Y0_GPIO_Port, KEY_Y0_Pin},
     {KEY_Y1_GPIO_Port, KEY_Y1_Pin},
     {KEY_Y2_GPIO_Port, KEY_Y2_Pin},
     {KEY_Y3_GPIO_Port, KEY_Y3_Pin}};
static KEY_PIN_t __PinOutput[4] =
    {{KEY_X0_GPIO_Port, KEY_X0_Pin},
     {KEY_X1_GPIO_Port, KEY_X1_Pin},
     {KEY_X2_GPIO_Port, KEY_X2_Pin},
     {KEY_X3_GPIO_Port, KEY_X3_Pin}};

/**
 * @brief 扫描矩阵键盘并将结果储存在一个静态的16位数据中
 * 
 */
int keyboardscan(void)
{
    uint16_t __keyval = 0; //用一个16位的数据来表示16个按键
    for (int j = 0; j < 4; j++) //按序读取按键值
    {
        HAL_GPIO_WritePin(__PinOutput[j].PinPort, __PinOutput[j].Pinnum, GPIO_PIN_SET);
        for (int k = 0; k < 4; k++)
            __keyval += HAL_GPIO_ReadPin(__PinInput[k].PinPort, __PinInput[k].Pinnum) << (j + k * 4);
        HAL_GPIO_WritePin(__PinOutput[j].PinPort, __PinOutput[j].Pinnum, GPIO_PIN_RESET);
    }
    keyval = __keyval;

    for(int i = 0;i<16;i++)
    {
        if(GetKeyVal(i))
            return i+1;
    }
    return 0;
}

/**
 * @brief 获取按键值
 * 
 * @param keynum 按键序号，从0到15
 * @return 1表示按下，0表示松开
 */
uint8_t GetKeyVal(uint8_t keynum)
{
    return (keyval & (1 << keynum)) >> keynum;
}
